<?php
// 自定义api组件
// chdir(dirname(__FILE__));
error_reporting(E_ERROR);
// require_once ('../log.php');

/**
 * 执行一个 HTTP 请求，仅仅是post组件，其他语言请自行替换即可
 *
 * @param  string $from_host 执行请求的host
 * @param  string $from_port 执行端口
 * @param  string $from_url  地址
 * @param  array  $params    表单参数
 * @param  int    $timeout   超时时间
 * @param  string $method    请求方法 post / get
 * @return array  结果数组
 */
function sendZSHttp($from_host, $from_port, $from_url, $params, $method = 'get', $from_timeout = 10) {
	$url = "{$from_host}:{$from_port}{$from_url}";
	$curl = curl_init();
	if ('get' == $method) {//以GET方式发送请求
		$url .= "?" . http_build_query($params);
		curl_setopt($curl, CURLOPT_URL, $url);
	} else {//以POST方式发送请求
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_POST, 1);//post提交方式
		curl_setopt($curl, CURLOPT_POSTFIELDS, $params);//设置传送的参数
	}

	curl_setopt($curl, CURLOPT_HEADER, false);//设置header
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//要求结果为字符串且输出到屏幕上
	curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $from_timeout);//设置等待时间

	$res = curl_exec($curl);//运行curl
	// LOGINFO($res , "=== res");
	$err = curl_error($curl);

	if (false === $res || !empty($err)) {
		$Errno = curl_errno($curl);
		$Info = curl_getinfo($curl);
		curl_close($curl);

		// print_r($Info);

		return $err. ' result: ' . $res . 'error_msg: '.$Errno;
	}
	curl_close($curl);	// 关闭curl
	return $res;
}

/**
 * 执行一个 HTTP 请求，仅仅是post组件，其他语言请自行替换即可
 *
 * @param  string $from_host 执行请求的host
 * @param  string $from_port 执行端口
 * @param  string $from_url  地址
 * @param  array  $form_data http发送数据
 */

function sendFZSHttp($from_host, $from_port, $from_url, $form_data) {
	// 请求的域名例:baidu.com，这里是 localhost
	$host    = $from_host;
	$port    = $from_port;
	$errno   = '';
	$errstr  = '';
	// 设置连接超时时间
	$timeout = 60;
	// 请求域名后详细地址
	$url = $from_url;
	//如果是GET    请求，可直接将编译后的参数放到url上
	if ($form_data) {
		$url .= "?".http_build_query($form_data);
	}
	//请求方式
	$method  = "POST";
	// 创建连接句柄
	$fp = fsockopen($host, $port, $errno, $errstr, $timeout);
	if (!$fp) {
		// LOGINFO($fp, "========== fp失败");
		return false;
	}
	// LOGINFO($fp, "========== fp成功");
	// 0，资源流将会被转换为非阻塞模式；如果是1，资源流将会被转换为阻塞模式
	// 将此链接句柄变为非阻塞模式，如果传值中有文件，则异步无效，并且传值数组中文件以后的传值内容也无法正常传值
	stream_set_blocking($fp, 0);

	// 连接句柄不报错就拼接请求内容
	$out = "${method} ${url} HTTP/1.1\r\n";
	$out .= "Host:${host}\r\n";

	//==============不同传值方式 Content-type 值============================
	//GET及POST第一种，无需传递文件
	$out .= "Content-type:application/x-www-form-urlencoded\r\n";
	//POST第二种，可以传递文件
	// $out .= "Content-type:multipart/form-data; boundary=$boundary\r\n";
	//==============不同传值方式 Content-type 值结束============================

	$out .= "Content-length:" . strlen ($form_data) . "\r\n";
	$out .= "Connection:close\r\n\r\n";
	$out .= "${form_data}";

	// 发送请求
	fputs($fp, $out);
	// fwrite($fp, $out);
	// 非阻塞模式需要设置系统延时，否则程序会不等待收到结果就往下执行代码，这时会有获取不到结果的情况
	// 具体设置延时多长时间，具体还要看接口的响应时间多久
	// usleep (5000);

	// 获取返回内容（包含响应头信息）
	// $response = '';

	// while ($row = fread($fp, 4096)) {
	// 	$response .= $row;
	// }
	// //关闭链接
	// fclose ($fp);

	// // 过滤返回的响应头信息
	// // strpos() 函数查找字符串在另一字符串中第一次出现的位置。
	// $pos    = strpos ($response, "\r\n\r\n");
	// $header = substr ($response, 0, $pos);
	// $result = substr ($response, $pos + 4);

	// echo $header, "<br/>";
	// 输出返回结果
	echo $result;
}

// 参数解密
function generateSign($params, $AppSecret = 'oudadi') {
	ksort($params);

	$stringToBeSigned = $AppSecret;
	foreach ($params as $k => $v) {
		if (!is_array($v) && '@' != substr($v, 0, 1)) {
			$stringToBeSigned .= "$k$v";
		}
	}
	unset($k, $v);
	$stringToBeSigned .= $AppSecret;
	return strtoupper(md5($stringToBeSigned));
}

/**
 * 执行一个 sql 数据库操作
 *
 * @param  string $sql sql语句
 * 
 */

function simQuery($sql) {
	LOGINFO($sql, "=== sql");
	global $mysql_conn;
	return mysqli_fetch_array(mysqli_query($mysql_conn, $sql), MYSQLI_ASSOC);
}

function AllQuery($sql) {
	LOGINFO($sql, "=== sql");
	global $mysql_conn;
	$sql = mysqli_query($mysql_conn, $sql);
	$result = array();
	$index = 0;
	while(@$row = mysqli_fetch_array($sql, MYSQLI_ASSOC)){
		$result[$index] = $row;
		++$index;
	}

	return $result;
}

// 数组转对象
function array_to_object($arr) {
    if (gettype($arr) != 'array') {
        return;
    }
    foreach ($arr as $k => $v) {
        if (gettype($v) == 'array' || getType($v) == 'object') {
            $arr[$k] = (object)array_to_object($v);
        }
    }
 
    return (object)$arr;
}

// 对象转数组
function object_to_array($obj) {
	$obj = (array)$obj;
	foreach ($obj as $k => $v) {
		if (gettype($v) == 'resource') {
			return;
		}
		if (gettype($v) == 'object' || gettype($v) == 'array') {
			$obj[$k] = (array)object_to_array($v);
		}
	}

	return $obj;
}

function http_get_file($file_url, $path, $file_type) {	
	$save_to = $path."/".md5($file_url).".".$file_type;
	$content = file_get_contents($file_url);
	file_put_contents($save_to, $content);
	return $save_to;
}

?>